home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 51
/
Amiga Format CD51 (2000-03-10)(Future Publishing)(GB)[!][issue 2000-04].iso
/
-serious-
/
programming
/
e
/
powerd
/
source
/
pr2m.e
< prev
Wrap
Text File
|
2000-01-27
|
5KB
|
218 lines
PROC main()
DEF args:PTR TO LONG,ra,
name[256]:STRING,dest[256]:STRING,
src:PTR TO CHAR,l,f=NIL
args:=['diskfont',NIL]:LONG
IF ra:=ReadArgs('SOURCE/A,SASC/S',args,NIL)
IF args[1]
StringF(name,'\s_pragmas.h',args[0])
ELSE
StringF(name,'\s_lib.h',args[0])
ENDIF
StringF(dest,'\s.m',args[0])
IF (l:=FileLength(name))>0
IF src:=New(l)
IF f:=Open(name,OLDFILE)
Read(f,src,l)
Close(f)
ELSE
PrintFault(IoErr(),'pr2m')
ENDIF
IF f
IF f:=Open(dest,NEWFILE)
IF args[1] THEN xConvertSASC(f,src,l) ELSE xConvert(f,src,l)
VfPrintf(f,'\n',NIL)
Close(f)
ELSE
PrintFault(IoErr(),'pr2m')
ENDIF
ENDIF
Dispose(src)
ENDIF
ELSE
PrintFault(IoErr(),'pr2m')
ENDIF
FreeArgs(ra)
ELSE
PrintFault(IoErr(),'pr2m')
ENDIF
ENDPROC
PROC xConvert(f,src:PTR TO CHAR,l)
DEF p=0,type,head=FALSE,name[256]:STRING,offset,i
WHILE p<l
WHILE src[p]<>"#"
p++
IF p>=l THEN RETURN
IF CtrlC() THEN RETURN
ENDWHILE
IF StrCmp('#pragma',src+p,7)
p:=xSkip(src,p+7,l)
p:=xGetName(name,src,p,l)
IF StrCmp('amicall',name)
type:="AMIC"
ELSEIF StrCmp('tagcall',name)
type:="TAGC"
ELSE
PrintF('Only amicall and tagcall allowed (\s).\n',name)
RETURN
ENDIF
IF type
p:=xSkip(src,p,l)
IF src[p]="("
p:=xSkip(src,p+1,l)
p:=xGetName(name,src,p,l)
IF head=FALSE
VfPrintf(f,'LIBRARY \s\n',[name])
head:=TRUE
ELSE
VfPrintf(f,',\n',NIL)
ENDIF
ELSE
PrintF('"(" expected.\n')
RETURN
ENDIF
p:=xSkip(src,p,l)
IF src[p]=","
p:=xSkip(src,p+1,l)
p:=xGetName(name,src,p,l)
IF (name[0]="0") AND (name[1]="x")
name[0]:=" "
name[1]:="$"
offset:=Val(name)
ELSE
PrintF('"0x" expected.\n')
RETURN
ENDIF
ELSE
PrintF('"," expected.\n')
RETURN
ENDIF
p:=xSkip(src,p,l)
IF src[p]=","
p:=xSkip(src,p+1,l)
p:=xGetName(name,src,p,l)
VfPrintf(f,'\t\s',[name])
i:=0
WHILE src[p]<>")"
name[i]:=src[p]
IF p>=l THEN RETURN
IF CtrlC() THEN RETURN
i++
p++
ENDWHILE
name[i]:="\0"
VfPrintf(f,'\s',[name])
IF type="AMIC"
VfPrintf(f,')',NIL)
ELSEIF type="TAGC"
VfPrintf(f,':LIST OF TagItem)',NIL)
ENDIF
ELSE
PrintF('"," expected.\n')
RETURN
ENDIF
VfPrintf(f,'(d0)=-\d',[offset])
ENDIF
ELSE
p++
ENDIF
IF CtrlC() THEN RETURN
ENDWHILE
ENDPROC
PROC xConvertSASC(f,src:PTR TO CHAR,l)
DEF p=0,type,head=FALSE,name[256]:STRING,offset,i,num[16]:STRING,n
WHILE p<l
WHILE src[p]<>"#"
p++
IF p>=l THEN RETURN
IF CtrlC() THEN RETURN
ENDWHILE
IF StrCmp('#pragma',src+p,7)
p:=xSkip(src,p+7,l)
p:=xGetName(name,src,p,l)
IF StrCmp('libcall',name)
type:="LIBC"
ELSEIF StrCmp('tagcall',name)
type:="TAGC"
ELSE
PrintF('Only amicall and tagcall allowed (\s).\n',name)
RETURN
ENDIF
IF type
p:=xSkip(src,p,l) -> read base
p:=xGetName(name,src,p,l)
IF head=FALSE
VfPrintf(f,'LIBRARY \s\n',[name])
head:=TRUE
ELSE
VfPrintf(f,',\n',NIL)
ENDIF
p:=xSkip(src,p,l) -> read function name
p:=xGetName(name,src,p,l)
VfPrintf(f,'\t\s(',[name])
IF name[StrLen(name)-1]="A" THEN type:="TAGL"
p:=xSkip(src,p,l) -> read function offset
p:=xGetName(name,src,p,l)
StringF(num,'$\s',name)
offset:=Val(num)
p:=xSkip(src,p,l) -> read arguments
p:=xGetName(name,src,p,l)
i:=StrLen(name)-3
WHILE i>=0
n:=name[i]
StringF(num,'$\c',n)
n:=Val(num)
IF (n>=0) AND (n<=7) THEN VfPrintf(f,'d\d',[n])
IF (n>=8) AND (n<=15) THEN VfPrintf(f,'a\d',[n-8])
i--
IF CtrlC() THEN RETURN
EXIT i<0
VfPrintf(f,',',NIL)
ENDWHILE
IF type="LIBC"
VfPrintf(f,')',NIL)
ELSEIF type="TAGL"
VfPrintf(f,':PTR TO TagItem)',NIL)
ELSEIF type="TAGC"
VfPrintf(f,':LIST OF TagItem)',NIL)
ENDIF
VfPrintf(f,'(d0)=-\d',[offset])
ENDIF
ELSE
p++
ENDIF
IF CtrlC() THEN RETURN
ENDWHILE
ENDPROC
PROC xSkip(src:PTR TO CHAR,p,l)
WHILE (src[p]=" ") OR (src[p]="\t")
p++
IF p>=l THEN RETURN l
IF CtrlC() THEN RETURN l
ENDWHILE
ENDPROC p
PROC xGetName(dst:PTR TO CHAR,src:PTR TO CHAR,p,l)
DEF i=0
WHILE ((src[p]>="A") AND (src[p]<="Z")) OR ((src[p]>="a") AND (src[p]<="z")) OR ((src[p]>="0") AND (src[p]<="9")) OR (src[p]="_")
dst[i]:=src[p]
IF p>=l THEN RETURN l
IF CtrlC() THEN RETURN l
i++
p++
ENDWHILE
dst[i]:="\0"
ENDPROC p
CHAR '\n\n$VER:pr2m v1.0 by MarK (30.9.1999)\0\n\n'